# RVC Controller SW — Domain Model

| 항목 | 내용 |
|------|------|
| 문서 번호 | RVC-DM-002 |
| 버전 | v2.0 |
| 작성일 | 2026-05-29 |
| 작성자 | OOAD Team 9 |
| 상태 | 초안 (Draft) |

---

## 변경 이력 (Change History)

| 버전 | 날짜 | 변경 내용 | 작성자 |
|------|------|-----------|--------|
| v1.0 | 2026-05-19 | 최초 작성 — FR/UC 기반 도메인 개념 클래스 도출 | OOAD Team 9 |
| v2.0 | 2026-05-29 | HW 변경 반영 — 우측 장애물 센서 제거. SensorPosition.RIGHT 삭제, ObstacleSensor 인스턴스 변경, 도메인 규칙 갱신 | OOAD Team 9 |

---

## v1 → v2 변경 요약 (Change Summary)

| 변경 구분 | 대상 | 변경 내용 |
|-----------|------|-----------|
| **[삭제]** | `SensorPosition.RIGHT` | 우측 HW 센서 제거에 따라 열거값 삭제 |
| **[변경]** | `ObstacleSensor` 인스턴스 | FRONT·LEFT·RIGHT 3개 → FRONT·LEFT 2개 |
| **[변경]** | DR-01 | ObstacleSensor 인스턴스 수 3개 → 2개 |
| **[변경]** | DR-06 | 전방향 막힘 판단 조건 변경 (우측 확인 방법) |
| **[추가]** | DR-07 | 우회전+전방 센서를 이용한 우측 장애물 간접 감지 규칙 |

---

## 1. Domain Model 다이어그램

![Domain Model v2](diagrams/domain_model.png)

---

## 2. 도메인 클래스 정의

| 클래스 | 유형 | 설명 | 변경 구분 |
|--------|------|------|-----------|
| **RVC** | 개념 클래스 | 로봇 청소기 본체. 전체 시스템의 루트 객체 | — |
| **Controller** | 개념 클래스 | 센서 데이터를 읽고 MovementUnit·CleaningUnit에 명령을 내리는 제어 중심 | — |
| **MovementUnit** | 개념 클래스 | 이동 방향·속도를 관리하는 이동 제어 단위 | — |
| **CleaningUnit** | 개념 클래스 | 청소 파워 수준과 부스트 지속시간을 관리하는 청소 단위 | — |
| **Sensor** | 추상 클래스 | 모든 센서의 공통 속성(ID, 상태)을 정의하는 추상 개념 | — |
| **ObstacleSensor** | 구체 클래스 | 특정 방향(FRONT/LEFT)의 장애물 유무를 감지. 우측은 우회전 기동+전방 센서로 간접 확인 | **[변경]** |
| **DustSensor** | 구체 클래스 | 먼지 농도를 측정하여 감지 여부를 판단 | — |
| **Obstacle** | 환경 개념 | 센서가 감지한 실세계 장애물 | — |
| **Dust** | 환경 개념 | 먼지 센서가 감지한 이물질 | — |

> **[변경] ObstacleSensor:**  
> v1에서는 FRONT·LEFT·RIGHT 세 방향에 각각 1개씩 총 3개의 인스턴스가 존재하였다.  
> v2에서는 우측 HW 센서가 제거되어 FRONT·LEFT 두 인스턴스만 존재한다.  
> 우측 방향 장애물 확인은 HW 센서가 아닌 **MovementUnit을 통한 우회전 기동 후 FRONT ObstacleSensor 재조회**로 수행된다.

---

## 3. 관계 정의

| 관계 | From | To | 다중성 | 의미 | 변경 구분 |
|------|------|----|--------|------|-----------|
| Composition | RVC | Controller | 1 : 1 | RVC는 하나의 Controller를 소유 | — |
| Composition | RVC | MovementUnit | 1 : 1 | RVC는 하나의 이동 단위를 소유 | — |
| Composition | RVC | CleaningUnit | 1 : 1 | RVC는 하나의 청소 단위를 소유 | — |
| Aggregation | Controller | Sensor | 1 : 1..* | Controller는 하나 이상의 센서를 감시 | — |
| Association | Controller | MovementUnit | 1 : 1 | Controller가 이동 명령을 전달 | — |
| Association | Controller | CleaningUnit | 1 : 1 | Controller가 청소 명령을 전달 | — |
| Generalization | Sensor | ObstacleSensor | — | ObstacleSensor는 Sensor의 하위 개념 | — |
| Generalization | Sensor | DustSensor | — | DustSensor는 Sensor의 하위 개념 | — |
| Dependency | ObstacleSensor | Obstacle | 1 : 0..1 | 장애물을 감지(있을 수도 없을 수도) | — |
| Dependency | DustSensor | Dust | 1 : 0..1 | 먼지를 감지(있을 수도 없을 수도) | — |

---

## 4. 열거형(Enum) 정의

| Enum | 값 | 사용 클래스 | 변경 구분 |
|------|----|------------|-----------|
| **RVCState** | CLEANING, STOPPED, TURNING, REVERSING | RVC | — |
| **Direction** | FORWARD, BACKWARD, LEFT, RIGHT | MovementUnit | — |
| **PowerLevel** | NORMAL, BOOSTED | CleaningUnit | — |
| **SensorStatus** | ACTIVE, ERROR | Sensor | — |
| **SensorPosition** | FRONT, LEFT ~~, RIGHT~~ | ObstacleSensor, Obstacle | **[변경]** |

> **[삭제] SensorPosition.RIGHT:**  
> v1에서는 `SensorPosition`이 FRONT · LEFT · RIGHT 세 값을 가졌다.  
> v2에서는 우측 HW 센서가 제거되어 `RIGHT` 값이 삭제된다.  
> `SensorPosition`은 이제 FRONT · LEFT 두 값만 가지며, 우측 방향은 물리적 센서 위치가 아닌 기동(우회전)으로 확인한다.

---

## 5. 주요 도메인 규칙 (Domain Rules)

| 규칙 ID | 설명 | 관련 FR | 변경 구분 |
|---------|------|---------|-----------|
| DR-01 | ObstacleSensor는 FRONT · LEFT 총 **2개** 인스턴스로 존재 | FR-SEN-01~02 | **[변경]** |
| DR-02 | Controller의 폴링 주기는 100ms 이하 | NFR-PER-03 | — |
| DR-03 | SensorStatus가 ERROR이면 RVCState는 STOPPED로 강제 전환 | NFR-REL-01 | — |
| DR-04 | CleaningUnit.powerLevel이 BOOSTED로 전환 후 boostDuration 경과 시 NORMAL로 자동 복귀 | FR-CLN-02~03 | — |
| DR-05 | RVCState가 STOPPED일 때도 CleaningUnit.isActive는 true 유지 | FR-CLN-04 | — |
| DR-06 | FRONT · LEFT 모두 Obstacle 감지 후, 우회전 기동을 통해 전방 센서로 우측도 막힘을 확인한 경우 RVCState는 REVERSING으로 전환 | FR-MOV-05 | **[변경]** |
| DR-07 | 우측 방향 장애물 확인은 Controller가 MovementUnit에 우회전(90°) 명령 후 FRONT ObstacleSensor를 재조회하여 수행 | FR-SEN-03(신), FR-MOV-03 | **[추가]** |

> **[변경] DR-01:**  
> v1 DR-01: "ObstacleSensor는 FRONT / LEFT / RIGHT 총 **3개** 인스턴스로 존재"  
> v2 DR-01: 우측 HW 센서 제거로 FRONT · LEFT **2개** 인스턴스만 존재
>
> **[변경] DR-06:**  
> v1 DR-06: "FRONT · LEFT · RIGHT 모두 Obstacle 감지 시 RVCState는 REVERSING으로 전환"  
> → 우측 HW 센서로 우측 장애물을 직접 감지하여 판단하였음.  
> v2 DR-06: FRONT · LEFT ObstacleSensor가 모두 막힘을 감지하고, 추가로 우회전 기동을 통해 전방 센서로 우측 방향도 막혀 있음을 확인한 경우 REVERSING 전환.  
> → **REVERSING 상태 자체는 유지된다.**
>
> **[추가] DR-07:**  
> 우측 HW 센서가 없으므로 우측 방향 감지를 위한 새로운 도메인 규칙이 도출된다.  
> Controller는 우측 방향 확인이 필요할 때 MovementUnit에 우회전(90°) 명령을 내리고, 이후 FRONT ObstacleSensor를 재조회하여 원래 우측 방향의 장애물 유무를 판단한다.  
> 이는 물리적 센서 추가 없이 기존 `MovementUnit`과 `ObstacleSensor(FRONT)` 두 도메인 개념의 협력으로 우측 감지 기능을 유지하는 핵심 도메인 규칙이다.
